package cn.mcsys.myadmin.common.utils;

import cn.mcsys.myadmin.modules.air.entity.AirCar;
import cn.mcsys.myadmin.modules.platform.entity.AirVehicleGpsBus;
import cn.mcsys.myadmin.modules.worker.entity.AirTaxi;

import java.util.List;

/**
 * @author bobo
 * @create 2018-09-30 15:25
 * @desc ${DESCRIPTION}
 **/
public class GpsUtil {
    /**
     * WGS84转GCJ02(火星坐标系)
     *
     * @param lng WGS84坐标系的经度
     * @param lat WGS84坐标系的纬度
     * @return 火星坐标数组
     */
    static double x_PI = 3.14159265358979324 * 3000.0 / 180.0;
    static double pi = 3.1415926535897932384626;
    static double a = 6378245.0;
    static double ee = 0.00669342162296594323;

    public static double[] wgs84togcj02(double lng, double lat) {
        if (out_of_china(lng, lat)) {
            return new double[]{lng, lat};
        }
        double dlat = transformlat(lng - 105.0, lat - 35.0);
        double dlng = transformlng(lng - 105.0, lat - 35.0);
        double radlat = lat / 180.0 * pi;
        double magic = Math.sin(radlat);
        magic = 1 - ee * magic * magic;
        double sqrtmagic = Math.sqrt(magic);
        dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi);
        dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * pi);
        double mglat = lat + dlat;
        double mglng = lng + dlng;
        return new double[]{mglng, mglat};
    }

    private static boolean out_of_china(double lng, double lat) {
        return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55);
    }

    private static double transformlat(double lng, double lat) {
        double ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
        ret += (20.0 * Math.sin(6.0 * lng * pi) + 20.0 * Math.sin(2.0 * lng * pi)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(lat * pi) + 40.0 * Math.sin(lat / 3.0 * pi)) * 2.0 / 3.0;
        ret += (160.0 * Math.sin(lat / 12.0 * pi) + 320 * Math.sin(lat * pi / 30.0)) * 2.0 / 3.0;
        return ret;
    }

    private static double transformlng(double lng, double lat) {
        double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
        ret += (20.0 * Math.sin(6.0 * lng * pi) + 20.0 * Math.sin(2.0 * lng * pi)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(lng * pi) + 40.0 * Math.sin(lng / 3.0 * pi)) * 2.0 / 3.0;
        ret += (150.0 * Math.sin(lng / 12.0 * pi) + 300.0 * Math.sin(lng / 30.0 * pi)) * 2.0 / 3.0;
        return ret;
    }

    public static List<AirCar> changeCarListLngLat(List<AirCar> carList) {
        for (AirCar car : carList) {
            if(car.getLon()!=null) {
                double[] togcj02 = GpsUtil.wgs84togcj02(Double.valueOf(car.getLon()), Double.valueOf(car.getLat()));
                car.setLon(String.valueOf(togcj02[0]));
                car.setLat(String.valueOf(togcj02[1]));
            }
        }
        return carList;
    }

    public static List<AirVehicleGpsBus> changeBusListLngLat(List<AirVehicleGpsBus> busList) {
        for (AirVehicleGpsBus bus : busList) {
            if(bus.getLon()!=null) {
                double[] togcj02 = GpsUtil.wgs84togcj02(Double.valueOf(bus.getLon()), Double.valueOf(bus.getLat()));
                bus.setLon(String.valueOf(togcj02[0]));
                bus.setLat(String.valueOf(togcj02[1]));
            }
        }
        return busList;
    }

    public static List<AirTaxi> changetaxiListLngLat(List<AirTaxi> taxiList) {
        for (AirTaxi taxi : taxiList) {
            double[] togcj02 = GpsUtil.wgs84togcj02(Double.valueOf(taxi.getLon()), Double.valueOf(taxi.getLat()));
            taxi.setLon(String.valueOf(togcj02[0]));
            taxi.setLat(String.valueOf(togcj02[1]));
        }
        return taxiList;
    }
}
